package bkx1;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
//从文件读取数据（通过 Scanner 和 File 类）。
//将数据写入文件（通过 BufferedWriter 和 FileWriter 类）。
//处理输入输出相关的异常（如 IOException 和 FileNotFoundException）。
//使用 Map 和 HashMap 来存储学生数据及其对应的课程信息。


//student类
class Student { 
    private String studentId;
    private String name;
    private Map<String, Course> courses;
    private double gpa;

    public Student(String studentId, String name) {
        this.studentId = studentId;
        this.name = name;
        this.courses = new HashMap<>(); //初始化一个空的课程集合
    }

    public void addCourse(String courseName, int score) {
        courses.put(courseName, new Course(courseName, score));
    }//向学生的课程集合中添加一门课程，使用课程名称和分数来创建一个新的 Course 对象。


    public void calculateGpa() {
        double totalPoints = 0.0;
        for (Course course : courses.values()) {
            totalPoints += course.getGradePoint();
        }
        this.gpa = courses.size() > 0 ? totalPoints / courses.size() : 0.0;//如果 courses.size() > 0 为 true，则执行 totalPoints / courses.size()，即计算 GPA。如果课程数量为 0（即 courses.size() <= 0），则返回 0.0，表示没有课程时 GPA 为 0。
    }//计算总gpa值

    public double getGpa() {
        return gpa;
    }

    public String getStudentId() {
        return studentId;
    }

    public String getName() {
        return name;
    }

    public Map<String, Course> getCourses() {
        return courses;
    }//获取学生GPA、ID、姓名和课程信息的getter方法。

    public String toString() {
        StringBuilder result = new StringBuilder("Student ID: " + studentId + ", Name: " + name + "\n");
        for (Course course : courses.values()) {
            result.append(course.toString()).append("\n");
        }
        result.append("GPA: ").append(String.format("%.2f", gpa));
        return result.toString();
    }//返回学生信息的字符串表示，包括学生ID、姓名、每门课程的成绩和最终的GPA。
}

//course类
class Course {
    private String courseName;
    private int score;
    private String grade;

    public Course(String courseName, int score) {
        this.courseName = courseName;
        this.score = score;
        this.grade = Grade(score);
    }

    private String Grade(int score) {
        if (score >= 90) return "A";
        else if (score >= 80) return "B";
        else if (score >= 70) return "C";
        else if (score >= 60) return "D";
        else return "F";
    }

    public double getGradePoint() {
        switch (grade) {
            case "A": return 4.0;
            case "B": return 3.0;
            case "C": return 2.0;
            case "D": return 1.0;
            default: return 0.0;
        }
    }

    public String toString() {
        return courseName + ": Score = " + score + ", Grade = " + grade;
    }//toString 方法返回课程的信息，包括课程名称、分数和等级。
}

//学分管理系统
public class CreditManagementSystem {
    private Map<String, Student> students = new HashMap<>();//这是一个 Map 类型的数据结构，Map 是 Java 中的一个接口，表示一种映射关系，它存储的是键值对（key-value pairs）。

//从指定的文件中读取学生数据。
    public void importDataFromFile(String fileName) {
        try (Scanner scanner = new Scanner(new File(fileName))) {
            scanner.nextLine(); // Skip header
            while (scanner.hasNextLine()) {
                String[] data = scanner.nextLine().split("\t");
                if (data.length < 7) {
                    System.err.println("Skipping malformed line: " + String.join("\t", data));
                    continue;
                }
                String studentId = data[0];
                String name = data[1];
                Student student = new Student(studentId, name);
                student.addCourse("高数", Integer.parseInt(data[2]));
                student.addCourse("大学英语", Integer.parseInt(data[3]));
                student.addCourse("Java", Integer.parseInt(data[4]));
                student.addCourse("Linux", Integer.parseInt(data[5]));
                student.addCourse("Python", Integer.parseInt(data[6]));
                student.calculateGpa();
                students.put(studentId, student);
            }
        } catch (FileNotFoundException e) {
            System.err.println("Error: File not found - " + e.getMessage());
        }//从指定的文件中读取学生数据。文件应该包含学生ID、姓名和各门课程的成绩。文件中的每一行代表一个学生的数据
    }

    public void printStudentInfo(String studentId) {
        Student student = students.get(studentId);
        if (student != null) {
            System.out.println(student);
        } else {
            System.out.println("Student not found with ID: " + studentId);
        }
    }//根据学生ID打印学生的详细信息

    //将所有学生gpa导入文件
    public void exportGPA(String fileName) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            writer.write("Student GPA Records:\n");
            for (Student student : students.values()) {
                writer.write("Student ID: " + student.getStudentId() + ", Name: " + student.getName() + "\n");
                for (Course course : student.getCourses().values()) {
                    writer.write(course.toString() + "\n");
                }
                writer.write("GPA: " + String.format("%.2f", student.getGpa()) + "\n");
                writer.write("---------------\n");
            }
            System.out.println("All student GPA records exported successfully to " + fileName);
        } catch (IOException e) {
            System.out.println("Error exporting GPA records: " + e.getMessage());
        }
    }

    //main方法
    public static void main(String[] args) {
        CreditManagementSystem system = new CreditManagementSystem();//创建一个 CreditManagementSystem 对象
        system.importDataFromFile("C:\\Users\\kexin\\OneDrive\\桌面\\java\\bkx1\\学生成绩.txt");

        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter student ID to get GPA:");
        String studentId = scanner.nextLine();
        system.printStudentInfo(studentId);
        //从用户输入获取学生ID，并打印该学生的详细信息。

        System.out.println("Enter file path to export all GPA records:");
        String gpaFilePath = scanner.nextLine();
        system.exportGPA(gpaFilePath);

        scanner.close();//关闭 Scanner 对象，结束程序。
    }
}

